package MyArrayList1;

import java.util.Arrays;
import java.util.List;

public class MyArrayList {
    //定义线性表的数组
    private int[]array;
    //对数组中实际元素的个数
    private int useSize;

    public MyArrayList(){
        //默认数组长度是10
        array=new int[10];
    }

    // 打印顺序表
    public void display() {
        //遍历打印数组每一个元素
        for (int i = 0; i < useSize; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

    //判断数组是否为满
    public boolean isFull(){
        return useSize== array.length;
    }

    // 新增元素,默认在数组最后新增
    public void add(int data) {
        //增加元素前要先判断数组是否为满，为满时要扩容
        if(isFull()){
            //注意该表达式返回值为一个新的应用，要用this.array接收....
            array=Arrays.copyOf(this.array,2*this.array.length);
        }
        array[useSize]=data;
        useSize++;
    }

    //检查数组下标合法性
    public boolean checkIndexOF(int indexOf){
        if(indexOf<0||indexOf>useSize){
            return false;
        }
        return true;
    }
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        //第一步：判断pos下标合法性
        if(!checkIndexOF(pos)){
            throw new MyArrayListIndexOfException("pos下标不合法");
        }
        //第二步：判断数组是否为满
        if(isFull()){
            Arrays.copyOf(array,array.length+4);
        }
        //第三步：pos下标插入元素前要对原数组数据进行"挪动"
        for (int i = useSize-1; i>=pos; i--) {
            array[i+1]=array[i];
        }
        //第四步：在pos位置插入数据
        array[pos]=data;
        useSize++;
    }

    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        //遍历数组
            for (int i = 0; i < useSize; i++) {
                if(array[i]==toFind){
                    System.out.println("找到了");
                    return true;
                }
        }
        return false;
    }

    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        //遍历数组
        for (int i = 0; i < useSize; i++) {
            if(array[i]==toFind){
                return i;
            }
        }
        return -1;
    }

    // 获取 pos 位置的元素
    public int get(int pos) {
        //判断下标合法性
        if(!checkIndexOF(pos)){
            throw new MyArrayListIndexOfException("查找的pos下标元素非法");
        }
        return array[pos];
    }

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        //判断下标合法性
        if(!checkIndexOF(pos)){
            throw new MyArrayListIndexOfException("要修改的pos下标非法");
        }
        array[pos]=value;
    }

    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        //找到要移除元素的下标
        int indexOf=indexOf(toRemove);
        for (int i = indexOf+1; i <=useSize-1; i++) {
            array[i-1]=array[i];
        }
        useSize--;
    }
    // 获取顺序表长度
    public int size() { return useSize; }
    // 清空顺序表
    public void clear() {
        for (int i = 0; i < useSize; i++) {
            array[i]=0;
        }
        useSize=0;
    }
}
